package br.com.remedioCerto.dao;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import br.com.remedioCerto.model.Perfil;
import br.com.remedioCerto.model.Receita;
import br.com.remedioCerto.model.Remedio;

public class ReceitaDao extends BasicoDao<Receita> {

	public static final String RECEITA_TB = "RECEITA";
	public static final String RECEITA_COLUNA_ID = "id";
	public static final String RECEITA_COLUNA_STATUS = "STATUS";
	public static final String RECEITA_COLUNA_DESCRICAO = "DESCRICAO";
	public static final String RECEITA_COLUNA_INICIO = "INICIO";
	public static final String RECEITA_COLUNA_PERIODO_TIPO = "PERIODO_TIPO";
	public static final String RECEITA_COLUNA_PERIODO_DIAS = "PERIODO_DIAS";
	public static final String RECEITA_COLUNA_FREQUENCIA_TIPO = "FREQUENCIA_TIPO";
	public static final String RECEITA_COLUNA_FREQUENCIA_DIAS_PAUSA = "FREQUENCIA_DIAS_PAUSA";
	public static final String RECEITA_COLUNA_FREQUENCIA_DIAS_SEM_PAUSA = "FREQUENCIA_DIAS_SEM_PAUSA";
	public static final String RECEITA_COLUNA_FREQUENCIA_SEMANA_DOM = "FREQUENCIA_SEMANA_DOM";
	public static final String RECEITA_COLUNA_FREQUENCIA_SEMANA_SEG = "FREQUENCIA_SEMANA_SEG";
	public static final String RECEITA_COLUNA_FREQUENCIA_SEMANA_TER = "FREQUENCIA_SEMANA_TER";
	public static final String RECEITA_COLUNA_FREQUENCIA_SEMANA_QUA = "FREQUENCIA_SEMANA_QUA";
	public static final String RECEITA_COLUNA_FREQUENCIA_SEMANA_QUI = "FREQUENCIA_SEMANA_QUI";
	public static final String RECEITA_COLUNA_FREQUENCIA_SEMANA_SEX = "FREQUENCIA_SEMANA_SEX";
	public static final String RECEITA_COLUNA_FREQUENCIA_SEMANA_SAB = "FREQUENCIA_SEMANA_SAB";
	public static final String RECEITA_COLUNA_PERFIL_ID = "PERFIL_ID";
	public static final String RECEITA_COLUNA_REMEDIO_ID = "REMEDIO_ID";
	
	
	public static final String RECEITA_CREATE_TABLE = "CREATE TABLE "+ RECEITA_TB + "  (" 
						+ RECEITA_COLUNA_ID							+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
						+ RECEITA_COLUNA_STATUS 					+ " INTEGER NOT NULL, "						
						+ RECEITA_COLUNA_DESCRICAO 					+ " TEXT,"
						+ RECEITA_COLUNA_INICIO 					+ " INTEGER NOT NULL, "
						+ RECEITA_COLUNA_PERIODO_TIPO 				+ " INTEGER NOT NULL, "
						+ RECEITA_COLUNA_PERIODO_DIAS		 		+ " INTEGER, "						
						+ RECEITA_COLUNA_FREQUENCIA_TIPO 			+ " INTEGER NOT NULL, "
						+ RECEITA_COLUNA_FREQUENCIA_DIAS_PAUSA 		+ " INTEGER, "						
						+ RECEITA_COLUNA_FREQUENCIA_DIAS_SEM_PAUSA 	+ " INTEGER, "
						+ RECEITA_COLUNA_FREQUENCIA_SEMANA_DOM		+ " INTEGER, "
						+ RECEITA_COLUNA_FREQUENCIA_SEMANA_SEG		+ " INTEGER, "
						+ RECEITA_COLUNA_FREQUENCIA_SEMANA_TER		+ " INTEGER, "
						+ RECEITA_COLUNA_FREQUENCIA_SEMANA_QUA		+ " INTEGER, "
						+ RECEITA_COLUNA_FREQUENCIA_SEMANA_QUI		+ " INTEGER, "
						+ RECEITA_COLUNA_FREQUENCIA_SEMANA_SEX		+ " INTEGER, "
						+ RECEITA_COLUNA_FREQUENCIA_SEMANA_SAB		+ " INTEGER, "
						+ RECEITA_COLUNA_PERFIL_ID 					+ " INTEGER NOT NULL, "
						+ RECEITA_COLUNA_REMEDIO_ID 				+ " INTEGER NOT NULL, "
						
						+ " FOREIGN KEY("+RECEITA_COLUNA_PERFIL_ID+") REFERENCES "
						+ PerfilDao.PERFIL_TB +"("+PerfilDao.PERFIL_COLUNA_ID+"), "
						
						+ " FOREIGN KEY("+RECEITA_COLUNA_REMEDIO_ID+") REFERENCES "
						+ RemedioDao.REMEDIO_TB +"("+RemedioDao.REMEDIO_COLUNA_ID+"));";
	 	
	
	public ReceitaDao(Context context) {
		super(context);
	}


	@Override
	protected ContentValues toContent(Receita receita) {
		ContentValues cv = new ContentValues();
		
		cv.put(RECEITA_COLUNA_STATUS, receita.isStatus() ? 1 : 0);
		cv.put(RECEITA_COLUNA_DESCRICAO, receita.getDescricao());
		cv.put(RECEITA_COLUNA_INICIO, receita.getInicio().getTimeInMillis());
		cv.put(RECEITA_COLUNA_PERIODO_TIPO, receita.getPeriodoTipo());
		cv.put(RECEITA_COLUNA_PERIODO_DIAS, receita.getPeriodoDias());
		cv.put(RECEITA_COLUNA_FREQUENCIA_TIPO, receita.getFrequenciaTipo());
		cv.put(RECEITA_COLUNA_FREQUENCIA_DIAS_SEM_PAUSA, receita.getFrequenciaDiasSemPausa());
		cv.put(RECEITA_COLUNA_FREQUENCIA_DIAS_PAUSA, receita.getFrequenciaDiasPausa());
		cv.put(RECEITA_COLUNA_FREQUENCIA_SEMANA_DOM, receita.isSemanaDomingo() ? 1 : 0);
		cv.put(RECEITA_COLUNA_FREQUENCIA_SEMANA_SEG, receita.isSemanaSegunda() ? 1 : 0);
		cv.put(RECEITA_COLUNA_FREQUENCIA_SEMANA_TER, receita.isSemanaTerca() ? 1 : 0);
		cv.put(RECEITA_COLUNA_FREQUENCIA_SEMANA_QUA, receita.isSemanaQuarta() ? 1 : 0);
		cv.put(RECEITA_COLUNA_FREQUENCIA_SEMANA_QUI, receita.isSemanaQuinta() ? 1 : 0);
		cv.put(RECEITA_COLUNA_FREQUENCIA_SEMANA_SEX, receita.isSemanaSexta() ? 1 : 0);
		cv.put(RECEITA_COLUNA_FREQUENCIA_SEMANA_SAB, receita.isSemanaSabado() ? 1 : 0);
		cv.put(RECEITA_COLUNA_PERFIL_ID, receita.getPerfil().getId());
		cv.put(RECEITA_COLUNA_REMEDIO_ID, receita.getRemedio().getId());
		return cv;
	}


	@Override
	protected Receita fromCursor(Cursor c) {
		if (c == null || c.getCount() < 1) {
			return null;
		}
		
		Receita receita = new Receita();
		receita.setId(c.getLong(c.getColumnIndex(RECEITA_COLUNA_ID)));
		receita.setStatus(c.getInt(c.getColumnIndex(RECEITA_COLUNA_STATUS)) == 1);
		receita.setDescricao(c.getString(c.getColumnIndex(RECEITA_COLUNA_DESCRICAO)));
		
		receita.setPeriodoTipo(c.getInt(c.getColumnIndex(RECEITA_COLUNA_PERIODO_TIPO)));
		receita.setPeriodoDias(c.getInt(c.getColumnIndex(RECEITA_COLUNA_PERIODO_DIAS)));
		receita.setFrequenciaTipo(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_TIPO)));
		receita.setFrequenciaDiasPausa(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_DIAS_PAUSA)));
		receita.setFrequenciaDiasSemPausa(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_DIAS_SEM_PAUSA)));
		
		receita.setSemanaDomingo(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_SEMANA_DOM)) == 1);
		receita.setSemanaSegunda(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_SEMANA_SEG)) == 1);
		receita.setSemanaTerca(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_SEMANA_TER)) == 1);
		receita.setSemanaQuarta(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_SEMANA_QUA)) == 1);
		receita.setSemanaQuinta(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_SEMANA_QUI)) == 1);
		receita.setSemanaSexta(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_SEMANA_SEX)) == 1);
		receita.setSemanaSabado(c.getInt(c.getColumnIndex(RECEITA_COLUNA_FREQUENCIA_SEMANA_SAB)) == 1);

		receita.setInicio(Calendar.getInstance());
		Long miliSec = c.getLong(c.getColumnIndex(RECEITA_COLUNA_INICIO));
		receita.getInicio().setTimeInMillis(miliSec);
		
		Perfil perfil = new Perfil();
		receita.setPerfil(perfil);
		receita.getPerfil().setId(c.getLong(c.getColumnIndex(RECEITA_COLUNA_PERFIL_ID)));
		
		Remedio remedio = new Remedio();
		receita.setRemedio(remedio);
		receita.getRemedio().setId(c.getLong(c.getColumnIndex(RECEITA_COLUNA_REMEDIO_ID)));
		
		return receita;
	}



	public void adiciona(Receita receita){
		
		Long id = inserir(RECEITA_TB, toContent(receita));
		if(id!= null && id > 0)receita.setId(id);
	}
	
	public void atualiza(Receita receita){
		
		atualizar(RECEITA_TB, toContent(receita), RECEITA_COLUNA_ID,receita.getId());
	}

	public void remove(Long  id){
		remover(RECEITA_TB, RECEITA_COLUNA_ID,id);
	}

	public Cursor lista(){
		return consultarTodos(RECEITA_TB);
	}
	
	public List<Receita> listaList() {
		List<Receita> listaReceita = new ArrayList<Receita>();

		Cursor c = lista();
	
		while (!c.isAfterLast()) {
			Receita r = fromCursor(c);
			listaReceita.add(r);
			c.moveToNext();
		}
		c.close();

		return listaReceita;

	}
		
	public Receita findById(Long receitaId){
		Cursor c = consultaBasica(RECEITA_TB ,null, RECEITA_COLUNA_ID +" = "+receitaId , null);
		return fromCursor(c);
	}
	
	
	public int quantidadePorPerfil(Long perfilId){
		Cursor c = consultaBasica(RECEITA_TB ,new String[] {RECEITA_COLUNA_ID}, RECEITA_COLUNA_PERFIL_ID +" = "+perfilId , null);
		return c.getCount();
	}
	
	public int quantidadePorRemedio(Long remedioId){
		Cursor c = consultaBasica(RECEITA_TB ,new String[] {RECEITA_COLUNA_ID}, RECEITA_COLUNA_REMEDIO_ID +" = "+remedioId , null);
		return c.getCount();
	}
	
	
}
